`default_nettype none

module uart_tx_m #(
    parameter [31:0] DATA_WIDTH_CP_I = 8,
    parameter [31:0] STOP_WIDTH_CP_I = 1
) (
    input rst_w_ni,
    input tx_clk_w_i,
    input prod_sign_w_i,
    input [DATA_WIDTH_CP_I-1:0] data_wp_i,

    output tx_pin_w_o,
    output cons_sign_w_o
);
    localparam [31:0] STATE_WIDTH_CP_L = $clog2(
        DATA_WIDTH_CP_I + STOP_WIDTH_CP_I + 1
    );
    localparam [31:0] WAIT_START_STATE_CP_L = STOP_WIDTH_CP_I;
    localparam [31:0] START_STATE_CP_L = -DATA_WIDTH_CP_I;

    // state寄存器的含义是：已移出移位寄存器（送上Tx）的停止位的个数。
    // 大于STOP_WIDTH的视为负数，表示还欠缺若干位才到停止位。初值为0。
    // 没有数据可发送时，state维持STOP_WIDTH。
    wire [STATE_WIDTH_CP_L:1] get_state_wp_l;
    wire [STATE_WIDTH_CP_L:1] set_state_wp_l =
        (!is_time_to_start_w_pl) ? get_state_wp_l + 1 :
        has_new_data_w_pl ? START_STATE_CP_L : WAIT_START_STATE_CP_L;
    dreg_m #(
        .WIDTH_CP_I(STATE_WIDTH_CP_L),
        .INIT_VALUE_CP_I(0)
    ) state_i_l (
        .rst_w_ni(rst_w_ni),
        .clk_w_i(tx_clk_w_i),
        .set_en_w_pi(1),
        .set_wp_i(set_state_wp_l),

        .get_wp_o(get_state_wp_l)
    );

    wire has_new_data_w_pl = (cons_sign_w_o != prod_sign_w_i);
    wire is_time_to_start_w_pl = (get_state_wp_l == WAIT_START_STATE_CP_L);

    wire is_start_w_pl = is_time_to_start_w_pl && has_new_data_w_pl;
    right_shift_reg_m #(
        .WIDTH_CP_I(DATA_WIDTH_CP_I + 1),
        .SHIFT_WIDTH_CP_I(1),
        .INIT_VALUE_CP_I(-1)
    ) shift_reg_i_l (
        .rst_w_ni(rst_w_ni),
        .clk_w_i(tx_clk_w_i),
        .shift_en_w_pi(1),
        .data_wp_i(-1),
        .set_en_w_pi(is_start_w_pl),
        .set_wp_i({data_wp_i, 1'b0}),

        .data_wp_o(tx_pin_w_o),
        .get_wp_o ()
    );

    wire set_cons_sign_w_l = ~cons_sign_w_o;
    dreg_m #(
        .WIDTH_CP_I(1),
        .INIT_VALUE_CP_I(0)
    ) cons_sign_i_l (
        .rst_w_ni(rst_w_ni),
        .clk_w_i(tx_clk_w_i),
        .set_en_w_pi(is_start_w_pl),
        .set_wp_i(set_cons_sign_w_l),

        .get_wp_o(cons_sign_w_o)
    );
endmodule
